package com.bytebuffer;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.util.internal.PlatformDependent;

public class PooledByteBufAllocatorFreeDemo {

	public static void main(String[] args) {
		ByteBufAllocator alloc = new PooledByteBufAllocator(PlatformDependent.directBufferPreferred());

	    // tiny规格内存分配，会变成大于等于16的整数倍的数：这里254会规格化为256
	    ByteBuf byteBuf = alloc.directBuffer(254);

	    // 读写bytebuf
	    byteBuf.writeInt(126);
	    byte[] bytes = "近日，巴以冲突造成大量人员伤亡，地区紧张局势进一步升级。中方作为安理会轮值主席，已推动安理会两次就巴以冲突举行紧急磋商，并起草安理会主席新闻谈话。中方希望通过16日的安理会紧急公开会，推动各方立即停止敌对行动，尽快重启政治对话，同时推动国际社会特别是安理会为缓解紧张局势、政治解决中东问题发挥积极作用".getBytes();
	    byteBuf.writeBytes(bytes);
	    // 上面写入大数据后，会导致重新分配一块内存，原先那块会放回PoolThreadCache里，此时再次分配就会从PoolThreadCache里分配
	    ByteBuf byteBuf2 = alloc.directBuffer(254);
	    ByteBuf byteBuf3 = alloc.directBuffer(254);
	    byteBuf2.writerIndex(4); // 回收并不会清除数据，所以这里还可以读到之前写入的数据
	    System.out.println(byteBuf2.readInt());

	    //很重要，内存释放
	    byteBuf.release();
	    byteBuf2.release();
	}

}
